java字符串长度越界问题

java字符串越界问题_百度知道
java字符串越界问题
importjava.util.SpublicclassTest40031{publicstaticvoidmain(String[]args){intri,repeat,count=0,word,i;SScannerin=newScanner(System.in);repeat=(in.ne...
import java.util.Spublic class Test40031{
public static void main(String []args ){
int ri, repeat,count=0,word,i;
Scanner in=new Scanner(System.in);
repeat=(in.nextLine()).charAt(0)-'0';
for(ri=1; ri&= ri++){
line=in.nextLine();
word=line.length();
for(i=1;i&=i++){
if(line.charAt(i)==' '&&line.charAt(i+1)!=' '){
System.out.println(count);
}}程序要求是判断一个字符串中单词个数(以一个或几个空格为分界),为什么我运行后出现字符串越界的问题还有就是为什么我把repeat的值改为 repeat=in.nextInt();后进行debug发现line变量无论输入什么内容全是空的。。。求解释啊!!!一个下午了 快疯了。。。
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
flyingFish211
flyingFish211
采纳数:6988
获赞数:18915
首先解释出错原因,line.charAt(i), i得最大长度为line.length-1,所以此处越界。修改为:
for (i = 1; i & i++) {
if(i == word-1){
if (line.charAt(i) == ' ' && line.charAt(i + 1) != ' ') {
}即可解决-----------------------repeat的值改为 repeat=in.nextInt();后进行debug发现line变量无论输入什么内容全是空的。。这个问题提得好。这是因为当你输入湾nextInt之后,你按一个回车,程序接受到的是你的回车换行\r\n。所以你的程序一直被阻塞,也就是一直在等待输入。所以一直是0输出。并不是那个流关闭了。我帮按照你的思路修改一下: import java.util.Spublic class Test40031 { public static void main(String[] args) {
int ri, repeat, count = 0, word,
Scanner in = new Scanner(System.in);
repeat = in.nextInt();
for (ri = 1; ri &= ri++) {
in = new Scanner(System.in);
line = in.nextLine();
count = 0;
word = line.length();
for (i = 1; i & i++) {
if (i == word - 1) {
if (line.charAt(i) == ' ' && line.charAt(i + 1) != ' ') {
System.out.println(count);
} }}----------------------3sfds asdfds sdfsl
sdfklsda %3sdlk sdfsdklj sdfsd3 ---------------我自己写一个统计单词的,用空白隔开单词import java.util.Spublic class Test40031 { public static void main(String[] args) {
int count = 0;
Scanner in = new Scanner(System.in);
int repeat = in.nextInt();
for (int ri = 1; ri &= ri++) {
in = new Scanner(System.in);
line = in.nextLine();
count = line.split(&\\s+&).
System.out.println(count);
} }}--------------3a b c3welcome to china3how are you? how do you like the food?9
爪哇┞灰机
爪哇┞灰机
采纳数:91
获赞数:867
判断单词个数不用那么麻烦吧。。。呵呵。。。import java.util.Spublic class Test{
public static void main(String []args ){
String contents = &&;
String[] words =
Scanner scan = new Scanner(System.in);
contents = scan.nextLine();
words = contents.split(&( )+&); //以一个或多个' '进行截取
System.out.println(words.length); //单词个数 }} repeat 使用来控制输入字符串次数的吧。。。用repeat=in.nextInt();之后,scanner流已经关闭了,不会让你输入新的值,所以每一次输入都需要新建一个scanner对象。。。也就是在for循环内 line=in.nextLine();之前新建scanner对象。。。
来自电脑网络类芝麻团
采纳数:142
获赞数:2681
参与团队:
'&&line.charAt(i+1)!=
此地方越界了,你是判断了word里的每一个字符,但是当你这个时候i+1了此时超过了line的长度,那么charAt就会报错了已经给你修改了import java.util.Spublic class Test40031{ public static void main(String []args ){
int ri, repeat,count=0,word,i;
Scanner in=new Scanner(System.in);
repeat=(in.nextLine()).charAt(0)-'0';
System.out.println(repeat);
for(ri=1; ri&= ri++){
System.out.println();
line=in.nextLine();
word=line.trim().length();
for(i=1;i&=i++){
if(i + 1 & line.length() && line.charAt(i)==' '&&line.charAt(i+1)!=' '){//此地方越界了,你是判断了word里的每一个字符,但是当你这个地方'&&line.charAt(i+1)!=
这个时候i+1了此时超过了line的长度,那么charAt就会报错了
System.out.println(count);
为你推荐:
其他类似问题
您可能关注的内容
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。11:48 提问
java中charAt()方法中字符串越界
目标:写一个micro词法分析器
问题:在读入写有micro代码文件的过程中,到最后一个字符(例如37)的时候报错。
报错信息:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 37
at java.lang.StringBuffer.charAt(Unknown Source)
at Analyzer.getChar(Analyzer.java:34)
at Analyzer.analyse(Analyzer.java:203)
at Analyzer.main(Analyzer.java:231)
//getChar()方法
public void getChar() {
ch = buffer.charAt(i);
//在主函数中
if (isLetter()) { // (一)如果ch为字母
while (isLetter() || isDigit()) {
getChar();
已更新全部代码:
import java.io.BufferedR
import java.io.FileNotFoundE
import java.io.FileR
import java.io.IOE
public class Analyzer {
private String keyWords[] = { "int", "begin", "end", "read", "write" }; // 关键字数组
private char operators[] = { '=', '+', '-' }; // 运算符数组
private char separators[] = { ',', ';', '(', ')' }; // 分隔符数组
private String fileSrcN // 源程序名
private StringBuffer buffer = new StringBuffer(); // 缓冲区
// 字符变量,存放最新读进的源程序字符
private static int i = 0;
private static int ketT// 作返回值,用于调用不同的打印的方法
private String strT // 字符数组,存放构成单词符号的字符串
public Analyzer() {
public Analyzer(String fileSrcName) {
this.fileSrcName = fileSrcN
* 将下一个输入字符读到ch中,搜索指示器前移一个字符 比如字符串的长度是6 但是每个字符的下标是从0开始计算 0 1 2 3 4 5
* 所以charAt(i)中的i最大是字符串长度-1. 你在do while循环里有个i++,i 如果等于5的时候,在charAt(i)就明显越界了
public void getChar() {
if (i & buffer.length()) {// i&6
ch = buffer.charAt(i);
if (i != buffer.length()-1) {
* 检查ch中的字符是否为空白,若是则调用getChar() 直至ch中进入一个非空白字符
public void getBc() {
while (Character.isSpaceChar(ch))
getChar();
* 将ch连接到strToken之后
public void concat() {
strToken +=
* 判断字符是否为字母
boolean isLetter() {
return Character.isLetter(ch);
* 判断字符是否为数字
boolean isDigit() {
return Character.isDigit(ch);
* 将搜索指示器回调一个字符位置,将ch值为空白字
public void retract() {
* 判断单词是否为关键字 [1,5]
public int isKeyWord() {
ketType = -1;
for (int i = 0; i & keyWords. i++) {
if (keyWords[i].equals(strToken))
ketType = i + 1;
return ketT
* 判断是否为运算符 [6,9) 678
public int isOperator() {
ketType = -1;
for (int i = 0; i & operators. i++) {
// 例如operators[]有 = + -,那么operators[1] = ‘+’
// 如果调用此方法判断是否为+,则当前i遍历的0、1
// 返回的种别码ketType为1+6=7
// 符合一开始设定的种别码表
if (ch == operators[i])
ketType = i + 6;
return ketT
* 判断是否为分隔符 [9,13) 9 10 11 12
public int isSeparators() {
ketType = -1;
for (int i = 0; i & separators. i++) {
if (ch == separators[i])
ketType = i + 9;
return ketT
* 打印关键字strToken
public void insertKeyWords(String strToken) {
// System.out.print("关键字,种别[1,5]");
System.out.println("(" + ketType + "," + strToken + ")");
* 打印运算符ch
public void insertOperators(char ch) {
// System.out.print("运算符,种别 [6,9)");
System.out.println("(" + ketType + "," + ch + ")");
* 打印分隔符
public void insertSeparators() {
// System.out.print("分隔符,种别 [9,13)");
System.out.println("(" + ketType + "," + ch + ")");
// 打印常数strToken
public void insertConst(String strToken) {
int num = Integer.parseInt(strToken);
// System.out.print("常数,种别13");
System.out.println("(" + 13 + "," + strToken + ")");
* 打印标识符(ID)
public void insertId(String strToken) {
// System.out.print("标识符,种别14");
System.out.println("(" + 14 + "," + ch + ")");
* 将源程序读入到缓冲区中
public void readFile() {
FileReader fis = new FileReader(this.fileSrcName);
BufferedReader br = new BufferedReader(fis);
String temp =
while ((temp = br.readLine()) != null) {
buffer.append(temp);
} catch (FileNotFoundException e) {
System.out.println("源文件未找到!");
e.printStackTrace();
} catch (IOException e) {
System.out.println("读写文件出现异常!");
e.printStackTrace();
* 词法分析
public void analyse() {
strToken = ""; // 置strToken为空串
while (i & buffer.length()) {
getChar();
if (isLetter()) { // (一)如果ch为字母
while (isLetter() || isDigit()) {
getChar();
retract(); // 回调
if (isKeyWord() & 0) { // 如果是为关键字,则保留字
insertKeyWords(strToken);
} else { // 否,则 符号
insertId(strToken);
strToken = "";
} else if (isDigit()) { // (二)如果ch为数字
while (isDigit()) {
getChar();
retract(); // 回调
insertConst(strToken); // 是常数
strToken = "";
} else if (isOperator() & 0) { // 是运算符
insertOperators(ch);
} else if (isSeparators() & 0) { // 是分隔符
insertSeparators();
public static void main(String[] args) {
Analyzer alr = new Analyzer("./src/input.txt");// 文件路径
alr.readFile();
alr.analyse();
* System.out.println("关键字,种别[1,5] 12345"); System.out.println(
* "运算符,种别 [6,9) 678"); System.out.println("分隔符,种别 [9,13) 9 10 11 12 ");
* System.out.println("常数,种别13"); //System.out.println("标识符(ID),种别14");
按赞数排序
看不懂 为什么 为了两行代码建立一个 getChar函数;
你的i是全局变量?你看看是不是i出了问题
while的判断有没有包含越界判断,看函数名应该是没有
那么getChar里的i总是有机会自增到越界报错的
代码不全,无法排查。buffer.charAt(i)的时候,应该对i进行判断的,最大长度是buffer的leng的。
就是数组越界,你贴的代码不全,无法看出是哪里越界了,在getChar()方法里加判断把,例如:
if(i&buffer.length()){
ch = buffer.charAt(i);
i是在哪里定义的?应该对i进行检测。
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐java-IndexOutOfBoundsException数组越界的问题求解
IndexOutOfBoundsException数组越界的问题求解
D/AndroidRuntime( 7415): Shutting down VM
--------- beginning of crash
E/AndroidRuntime( 7415): FATAL EXCEPTION: main
E/AndroidRuntime( 7415): Process: com.android.settings, PID: 7415
E/AndroidRuntime( 7415): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
E/AndroidRuntime( 7415):
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
E/AndroidRuntime( 7415):
at java.util.ArrayList.get(ArrayList.java:308)
E/AndroidRuntime( 7415):
at android.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:164)
E/AndroidRuntime( 7415):
at android.widget.ListView.dispatchDraw(ListView.java:3307)
E/AndroidRuntime( 7415):
at android.view.View.draw(View.java:15234)
E/AndroidRuntime( 7415):
at android.widget.AbsListView.draw(AbsListView.java:4110)
E/AndroidRuntime( 7415):
at android.view.View.updateDisplayListIfDirty(View.java:14167)
E/AndroidRuntime( 7415):
at android.view.View.getDisplayList(View.java:14189)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3389)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3368)
E/AndroidRuntime( 7415):
at android.view.View.updateDisplayListIfDirty(View.java:14127)
E/AndroidRuntime( 7415):
at android.view.View.getDisplayList(View.java:14189)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3389)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3368)
E/AndroidRuntime( 7415):
at android.view.View.updateDisplayListIfDirty(View.java:14127)
E/AndroidRuntime( 7415):
at android.view.View.getDisplayList(View.java:14189)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3389)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3368)
E/AndroidRuntime( 7415):
at android.view.View.updateDisplayListIfDirty(View.java:14127)
E/AndroidRuntime( 7415):
at android.view.View.getDisplayList(View.java:14189)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3389)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3368)
E/AndroidRuntime( 7415):
at android.view.View.updateDisplayListIfDirty(View.java:14127)
E/AndroidRuntime( 7415):
at android.view.View.getDisplayList(View.java:14189)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3389)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3368)
E/AndroidRuntime( 7415):
at android.view.View.updateDisplayListIfDirty(View.java:14127)
E/AndroidRuntime( 7415):
at android.view.View.getDisplayList(View.java:14189)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3389)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3368)
E/AndroidRuntime( 7415):
at android.view.View.updateDisplayListIfDirty(View.java:14127)
E/AndroidRuntime( 7415):
at android.view.View.getDisplayList(View.java:14189)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3389)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3368)
E/AndroidRuntime( 7415):
at android.view.View.updateDisplayListIfDirty(View.java:14127)
E/AndroidRuntime( 7415):
at android.view.View.getDisplayList(View.java:14189)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3389)
E/AndroidRuntime( 7415):
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3368)
E/AndroidRuntime( 7415):
at android.view.View.updateDisplayListIfDirty(View.java:14127)
E/AndroidRuntime( 7415):
at android.view.View.getDisplayList(View.java:14189)
E/AndroidRuntime( 7415):
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:273)
E/AndroidRuntime( 7415):
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:279)
E/AndroidRuntime( 7415):
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:318)
E/AndroidRuntime( 7415):
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2530)
E/AndroidRuntime( 7415):
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2352)
E/AndroidRuntime( 7415):
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1982)
E/AndroidRuntime( 7415):
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
E/AndroidRuntime( 7415):
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
E/AndroidRuntime( 7415):
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
E/AndroidRuntime( 7415):
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
E/AndroidRuntime( 7415):
at android.view.Choreographer.doFrame(Choreographer.java:550)
E/AndroidRuntime( 7415):
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
E/AndroidRuntime( 7415):
at android.os.Handler.handleCallback(Handler.java:739)
E/AndroidRuntime( 7415):
at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime( 7415):
at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime( 7415):
at android.app.ActivityThread.main(ActivityThread.java:5258)
E/AndroidRuntime( 7415):
at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 7415):
at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime( 7415):
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
E/AndroidRuntime( 7415):
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
W/ActivityManager( 3185):
Force finishing activity 1 com.android.settings/.SubSettings
表示看不出是哪行的代码有问题呀,报的都是api的错。。有谁知道不?
E/AndroidRuntime( 7415): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
E/AndroidRuntime( 7415): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList
这两行,第一行显示的是你的索引0是非法无效的,大小是0;
第二行是说你的ArrayList抛出索引越界异常。
你自己检查一下看看。
解决方案二:
你点的是哪个,就看那里面的问题,最好贴代码看一下。
解决方案三:
package com.android.settings.
import android.app.A
import android.app.ActivityM
import android.app.AlertD
import android.app.ApplicationErrorR
import android.app.D
import android.app.DialogF
import android.app.F
import android.app.PendingI
import android.content.ActivityNotFoundE
import android.content.ComponentN
import android.content.C
import android.content.DialogI
import android.content.I
import android.content.IntentS
import android.content.pm.ApplicationI
import android.content.pm.PackageM
import android.content.pm.PackageManager.NameNotFoundE
import android.content.pm.ProviderI
import android.content.pm.ServiceI
import android.content.res.R
import android.os.B
import android.os.D
import android.os.H
import android.os.SystemC
import android.os.UserH
import android.provider.S
import android.util.L
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.widget.B
import android.widget.TextV
import com.android.settings.R;
import com.android.settings.U
import java.io.F
import java.io.FileInputS
import java.io.FileOutputS
import java.io.IOE
import java.util.ArrayL
import java.util.C
public class RunningServiceDetails extends Fragment
implements RunningState.OnRefreshUiListener {
static final String TAG = "RunningServicesDetails";
static final String KEY_UID = "uid";
static final String KEY_USER_ID = "user_id";
static final String KEY_PROCESS = "process";
static final String KEY_BACKGROUND = "background";
static final int DIALOG_CONFIRM_STOP = 1;
ActivityManager mAm;
LayoutInflater mI
RunningState mS
boolean mHaveD
int mUserId;
String mProcessN
boolean mShowB
RunningState.MergedItem mMergedI
View mRootV
ViewGroup mAllD
ViewGroup mS
RunningProcessesView.ActiveItem mSnippetActiveI
RunningProcessesView.ViewHolder mSnippetViewH
int mNumServices, mNumP
TextView mServicesH
TextView mProcessesH
final ArrayList&ActiveDetail& mActiveDetails = new ArrayList&ActiveDetail&();
class ActiveDetail implements View.OnClickListener {
View mRootV
Button mStopB
Button mReportB
RunningState.ServiceItem mServiceI
RunningProcessesView.ActiveItem mActiveI
RunningProcessesView.ViewHolder mViewH
PendingIntent mManageI
ComponentName mI
void stopActiveService(boolean confirmed) {
RunningState.ServiceItem si = mServiceI
if (!confirmed) {
if ((si.mServiceInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0) {
showConfirmStopDialog(si.mRunningService.service);
getActivity().stopService(new Intent().setComponent(si.mRunningService.service));
if (mMergedItem == null) {
// If this is gone, we are gone.
mState.updateNow();
} else if (!mShowBackground && mMergedItem.mServices.size() &= 1) {
// If there was only one service, we are finishing it,
// so no reason for the UI to stick around.
mState.updateNow();
mState.updateNow();
public void onClick(View v) {
if (v == mReportButton) {
ApplicationErrorReport report = new ApplicationErrorReport();
report.type = ApplicationErrorReport.TYPE_RUNNING_SERVICE;
report.packageName = mServiceItem.mServiceInfo.packageN
report.installerPackageName = mInstaller.getPackageName();
report.processName = mServiceItem.mRunningService.
report.time = System.currentTimeMillis();
report.systemApp = (mServiceItem.mServiceInfo.applicationInfo.flags
& ApplicationInfo.FLAG_SYSTEM) != 0;
ApplicationErrorReport.RunningServiceInfo info
= new ApplicationErrorReport.RunningServiceInfo();
if (mActiveItem.mFirstRunTime &= 0) {
info.durationMillis = SystemClock.elapsedRealtime()-mActiveItem.mFirstRunT
info.durationMillis = -1;
ComponentName comp = new ComponentName(mServiceItem.mServiceInfo.packageName,
mServiceItem.mServiceInfo.name);
File filename = getActivity().getFileStreamPath("service_dump.txt");
FileOutputStream output =
output = new FileOutputStream(filename);
Debug.dumpService("activity", output.getFD(),
new String[] { "-a", "service", comp.flattenToString() });
} catch (IOException e) {
Log.w(TAG, "Can't dump service: " + comp, e);
} finally {
if (output != null) try { output.close(); } catch (IOException e) {}
FileInputStream input =
input = new FileInputStream(filename);
byte[] buffer = new byte[(int) filename.length()];
input.read(buffer);
info.serviceDetails = new String(buffer);
} catch (IOException e) {
Log.w(TAG, "Can't read service dump: " + comp, e);
} finally {
if (input != null) try { input.close(); } catch (IOException e) {}
filename.delete();
Log.i(TAG, "Details: " + info.serviceDetails);
report.runningServiceInfo =
Intent result = new Intent(Intent.ACTION_APP_ERROR);
result.setComponent(mInstaller);
result.putExtra(Intent.EXTRA_BUG_REPORT, report);
result.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(result);
if (mManageIntent != null) {
getActivity().startIntentSender(mManageIntent.getIntentSender(), null,
Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,
Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, 0);
} catch (IntentSender.SendIntentException e) {
Log.w(TAG, e);
} catch (IllegalArgumentException e) {
Log.w(TAG, e);
} catch (ActivityNotFoundException e) {
Log.w(TAG, e);
} else if (mServiceItem != null) {
stopActiveService(false);
} else if (mActiveItem.mItem.mBackground) {
// Background process.
Just kill it.
mAm.killBackgroundProcesses(mActiveItem.mItem.mPackageInfo.packageName);
// Heavy-weight process.
We'll do a force-stop on it.
mAm.forceStopPackage(mActiveItem.mItem.mPackageInfo.packageName);
StringBuilder mBuilder = new StringBuilder(128);
boolean findMergedItem() {
RunningState.MergedItem item =
ArrayList&RunningState.MergedItem& newItems = mShowBackground
? mState.getCurrentBackgroundItems() : mState.getCurrentMergedItems();
if (newItems != null) {
for (int i=0; i&newItems.size(); i++) {
RunningState.MergedItem mi = newItems.get(i);
if (mi.mUserId != mUserId) {
if (mUid &= 0 && mi.mProcess != null && mi.mProcess.mUid != mUid) {
if (mProcessName == null || (mi.mProcess != null
&& mProcessName.equals(mi.mProcess.mProcessName))) {
if (mMergedItem != item) {
mMergedItem =
void addServicesHeader() {
if (mNumServices == 0) {
mServicesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
mAllDetails, false);
mServicesHeader.setText(R.string.runningservicedetails_services_title);
mAllDetails.addView(mServicesHeader);
mNumServices++;
void addProcessesHeader() {
if (mNumProcesses == 0) {
mProcessesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
mAllDetails, false);
mProcessesHeader.setText(R.string.runningservicedetails_processes_title);
mAllDetails.addView(mProcessesHeader);
mNumProcesses++;
void addServiceDetailsView(RunningState.ServiceItem si, RunningState.MergedItem mi,
boolean isService, boolean inclDetails) {
if (isService) {
addServicesHeader();
} else if (mi.mUserId != UserHandle.myUserId()) {
// This is being called for another user, and is not a service...
// That is, it is a background processes, being added for the
// details of a user.
In this case we want a header for processes,
// since the top subject line is for the user.
addProcessesHeader();
RunningState.BaseItem bi = si != null ? si :
ActiveDetail detail = new ActiveDetail();
View root = mInflater.inflate(R.layout.running_service_details_service,
mAllDetails, false);
mAllDetails.addView(root);
detail.mRootView =
detail.mServiceItem =
detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
detail.mActiveItem = detail.mViewHolder.bind(mState, bi, mBuilder);
if (!inclDetails) {
root.findViewById(R.id.service).setVisibility(View.GONE);
if (si != null && si.mRunningService.clientLabel != 0) {
detail.mManageIntent = mAm.getRunningServiceControlPanel(
si.mRunningService.service);
TextView description = (TextView)root.findViewById(R.id.comp_description);
detail.mStopButton = (Button)root.findViewById(R.id.left_button);
detail.mReportButton = (Button)root.findViewById(R.id.right_button);
if (isService && mi.mUserId != UserHandle.myUserId()) {
// For services from other users, we don't show any description or
// controls, because the current user can not perform
// actions on them.
description.setVisibility(View.GONE);
root.findViewById(R.id.control_buttons_panel).setVisibility(View.GONE);
if (si != null && si.mServiceInfo.descriptionRes != 0) {
description.setText(getActivity().getPackageManager().getText(
si.mServiceInfo.packageName, si.mServiceInfo.descriptionRes,
si.mServiceInfo.applicationInfo));
if (mi.mBackground) {
description.setText(R.string.background_process_stop_description);
} else if (detail.mManageIntent != null) {
Resources clientr = getActivity().getPackageManager().getResourcesForApplication(
si.mRunningService.clientPackage);
String label = clientr.getString(si.mRunningService.clientLabel);
description.setText(getActivity().getString(R.string.service_manage_description,
} catch (PackageManager.NameNotFoundException e) {
description.setText(getActivity().getText(si != null
? R.string.service_stop_description
: R.string.heavy_weight_stop_description));
detail.mStopButton.setOnClickListener(detail);
detail.mStopButton.setText(getActivity().getText(detail.mManageIntent != null
? R.string.service_manage : R.string.service_stop));
detail.mReportButton.setOnClickListener(detail);
detail.mReportButton.setText(com.android.internal.R.string.report);
// check if error reporting is enabled in secure settings
int enabled = Settings.Global.getInt(getActivity().getContentResolver(),
Settings.Global.SEND_ACTION_APP_ERROR, 0);
if (enabled != 0 && si != null) {
detail.mInstaller = ApplicationErrorReport.getErrorReportReceiver(
getActivity(), si.mServiceInfo.packageName,
si.mServiceInfo.applicationInfo.flags);
detail.mReportButton.setEnabled(detail.mInstaller != null);
detail.mReportButton.setEnabled(false);
mActiveDetails.add(detail);
void addProcessDetailsView(RunningState.ProcessItem pi, boolean isMain) {
addProcessesHeader();
ActiveDetail detail = new ActiveDetail();
View root = mInflater.inflate(R.layout.running_service_details_process,
mAllDetails, false);
mAllDetails.addView(root);
detail.mRootView =
detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
detail.mActiveItem = detail.mViewHolder.bind(mState, pi, mBuilder);
TextView description = (TextView)root.findViewById(R.id.comp_description);
if (pi.mUserId != UserHandle.myUserId()) {
// Processes for another user are all sh there is
// no reason to have a description.
description.setVisibility(View.GONE);
} else if (isMain) {
description.setText(R.string.main_running_process_description);
int textid = 0;
CharSequence label =
ActivityManager.RunningAppProcessInfo rpi = pi.mRunningProcessI
final ComponentName comp = rpi.importanceReasonC
//Log.i(TAG, "Secondary proc: code=" + rpi.importanceReasonCode
+ " pid=" + rpi.importanceReasonPid + " comp=" + comp);
switch (rpi.importanceReasonCode) {
case ActivityManager.RunningAppProcessInfo.REASON_PROVIDER_IN_USE:
textid = R.string.process_provider_in_use_
if (rpi.importanceReasonComponent != null) {
ProviderInfo prov = getActivity().getPackageManager().getProviderInfo(
rpi.importanceReasonComponent, 0);
label = RunningState.makeLabel(getActivity().getPackageManager(),
prov.name, prov);
} catch (NameNotFoundException e) {
case ActivityManager.RunningAppProcessInfo.REASON_SERVICE_IN_USE:
textid = R.string.process_service_in_use_
if (rpi.importanceReasonComponent != null) {
ServiceInfo serv = getActivity().getPackageManager().getServiceInfo(
rpi.importanceReasonComponent, 0);
label = RunningState.makeLabel(getActivity().getPackageManager(),
serv.name, serv);
} catch (NameNotFoundException e) {
if (textid != 0 && label != null) {
description.setText(getActivity().getString(textid, label));
mActiveDetails.add(detail);
void addDetailsViews(RunningState.MergedItem item, boolean inclServices,
boolean inclProcesses) {
if (item != null) {
if (inclServices) {
for (int i=0; i&item.mServices.size(); i++) {
addServiceDetailsView(item.mServices.get(i), item, true, true);
if (inclProcesses) {
if (item.mServices.size() &= 0) {
// This item does not have any services, so it must be
// another interesting process...
we will put a fake service
// entry for it, to allow the user to "stop" it.
addServiceDetailsView(null, item, false, item.mUserId != UserHandle.myUserId());
// This screen is actually showing services, so also show
// the process details.
for (int i=-1; i&item.mOtherProcesses.size(); i++) {
RunningState.ProcessItem pi = i & 0 ? item.mProcess
: item.mOtherProcesses.get(i);
if (pi != null && pi.mPid &= 0) {
addProcessDetailsView(pi, i & 0);
void addDetailViews() {
for (int i=mActiveDetails.size()-1; i&=0; i--) {
mAllDetails.removeView(mActiveDetails.get(i).mRootView);
mActiveDetails.clear();
if (mServicesHeader != null) {
mAllDetails.removeView(mServicesHeader);
mServicesHeader =
if (mProcessesHeader != null) {
mAllDetails.removeView(mProcessesHeader);
mProcessesHeader =
mNumServices = mNumProcesses = 0;
if (mMergedItem != null) {
if (mMergedItem.mUser != null) {
ArrayList&RunningState.MergedItem&
if (mShowBackground) {
items = new ArrayList&RunningState.MergedItem&(mMergedItem.mChildren);
Collections.sort(items, mState.mBackgroundComparator);
Log.d("daixing","items is --&"+items.size());
items = mMergedItem.mC
for (int i=0; i&items.size(); i++) {
addDetailsViews(items.get(i), true, false);
for (int i=0; i&items.size(); i++) {
addDetailsViews(items.get(i), false, true);
addDetailsViews(mMergedItem, true, true);
void refreshUi(boolean dataChanged) {
if (findMergedItem()) {
dataChanged =
if (dataChanged) {
if (mMergedItem != null) {
mSnippetActiveItem = mSnippetViewHolder.bind(mState,
mMergedItem, mBuilder);
} else if (mSnippetActiveItem != null) {
// Clear whatever is currently being shown.
mSnippetActiveItem.mHolder.size.setText("");
mSnippetActiveItem.mHolder.uptime.setText("");
mSnippetActiveItem.mHolder.description.setText(R.string.no_services);
// No merged item, never had one.
Nothing to do.
addDetailViews();
private void finish() {
(new Handler()).post(new Runnable() {
public void run() {
Activity a = getActivity();
if (a != null) {
a.onBackPressed();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mUid = getArguments().getInt(KEY_UID, -1);
mUserId = getArguments().getInt(KEY_USER_ID, 0);
mProcessName = getArguments().getString(KEY_PROCESS, null);
mShowBackground = getArguments().getBoolean(KEY_BACKGROUND, false);
mAm = (ActivityManager)getActivity().getSystemService(Context.ACTIVITY_SERVICE);
mInflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mState = RunningState.getInstance(getActivity());
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.running_service_details, container, false);
Utils.prepareCustomPreferencesList(container, view, view, false);
mRootView =
mAllDetails = (ViewGroup)view.findViewById(R.id.all_details);
mSnippet = (ViewGroup)view.findViewById(R.id.snippet);
mSnippetViewHolder = new RunningProcessesView.ViewHolder(mSnippet);
// We want to retrieve the data right now, so any active managed
// dialog that gets created can find it.
ensureData();
public void onPause() {
super.onPause();
mHaveData =
mState.pause();
public void onResume() {
super.onResume();
ensureData();
ActiveDetail activeDetailForService(ComponentName comp) {
for (int i=0; i&mActiveDetails.size(); i++) {
ActiveDetail ad = mActiveDetails.get(i);
if (ad.mServiceItem != null && ad.mServiceItem.mRunningService != null
&& comp.equals(ad.mServiceItem.mRunningService.service)) {
private void showConfirmStopDialog(ComponentName comp) {
DialogFragment newFragment = MyAlertDialogFragment.newConfirmStop(
DIALOG_CONFIRM_STOP, comp);
newFragment.setTargetFragment(this, 0);
newFragment.show(getFragmentManager(), "confirmstop");
public static class MyAlertDialogFragment extends DialogFragment {
public static MyAlertDialogFragment newConfirmStop(int id, ComponentName comp) {
MyAlertDialogFragment frag = new MyAlertDialogFragment();
Bundle args = new Bundle();
args.putInt("id", id);
args.putParcelable("comp", comp);
frag.setArguments(args);
RunningServiceDetails getOwner() {
return (RunningServiceDetails)getTargetFragment();
public Dialog onCreateDialog(Bundle savedInstanceState) {
int id = getArguments().getInt("id");
switch (id) {
case DIALOG_CONFIRM_STOP: {
final ComponentName comp = (ComponentName)getArguments().getParcelable("comp");
if (getOwner().activeDetailForService(comp) == null) {
return new AlertDialog.Builder(getActivity())
.setTitle(getActivity().getString(R.string.runningservicedetails_stop_dlg_title))
.setMessage(getActivity().getString(R.string.runningservicedetails_stop_dlg_text))
.setPositiveButton(R.string.dlg_ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
ActiveDetail ad = getOwner().activeDetailForService(comp);
if (ad != null) {
ad.stopActiveService(true);
.setNegativeButton(R.string.dlg_cancel, null)
.create();
throw new IllegalArgumentException("unknown id " + id);
void ensureData() {
if (!mHaveData) {
mHaveData =
mState.resume(this);
// We want to go away if the service being shown no longer exists,
// so we need to ensure we have done the initial data retrieval before
// showing our ui.
mState.waitForData();
// And since we know we have the data, let's show the UI right away
// to avoid flicker.
refreshUi(true);
void updateTimes() {
if (mSnippetActiveItem != null) {
mSnippetActiveItem.updateTime(getActivity(), mBuilder);
Log.d("daixing","mActiveDetails is "+mActiveDetails.size());
for (int i=0; i&mActiveDetails.size(); i++) {
mActiveDetails.get(i).mActiveItem.updateTime(getActivity(), mBuilder);
public void onRefreshUi(int what) {
if (getActivity() == null)
switch (what) {
case REFRESH_TIME:
updateTimes();
case REFRESH_DATA:
refreshUi(false);
updateTimes();
case REFRESH_STRUCTURE:
refreshUi(true);
updateTimes();
表示没有看出来哪儿有数组越界风险。。。
解决方案四:
final ArrayList mActiveDetails = new ArrayList(); 定义为final类型size一直未0,也无法添加数据的
去掉final修饰符}

我要回帖

更多关于 java字符串数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信