捕获数组异常



大家好,提前感谢。

我在数组的一行代码中得到一个错误。我已经阅读了所有关于此的线程,但仍然无法正确处理异常,导致我的应用程序强制关闭。

这是我的密码。。。

public boolean HoraErronea(String HoraAValidar) throws IndexOutOfBoundsException
{
String HoraIntroducida = HoraAValidar;
boolean HoraErronea = false;
if(HoraIntroducida.length() < 3 || HoraIntroducida.length() > 5)
{
HoraErronea = true;
}
else
{
try
{
HoraIntroducida = HoraIntroducida.replace("-", ":");
String[] HoraTroceada = HoraIntroducida.split(":");
int hora = HoraTroceada[0].equals("")?-1:Integer.parseInt(HoraTroceada[0]);
int minuto = HoraTroceada[1].equals("")?-1:Integer.parseInt(HoraTroceada[1]);
if(!((hora >= 0 && hora <= 24) && (minuto >= 0 && minuto <= 59)))
{
HoraErronea = true;
}
}
catch (IndexOutOfBoundsException e)
{
e.printStackTrace();
}
}
return HoraErronea;
}

好吧,问题是当"HoraIntroducida"没有":"时,那么"HoraTroceada[1]"就不存在了,所以我的代码坏了,抛出了这个消息。。。

E/MessageQueue JNI:java.lang.ArrayIndexOutOfBoundsException:length=1;索引=1访问com.essimple.esley.FuncionesActivity.HoraErronea(FuncionesActivity.java:366)访问com.essimple.essley.CalendarioActivity.ValidaDatos(CalendarioActivity.java:483)访问com.essimple.essley.CalendarioActivity.onBackPressed(CalendarioActivity.java:523)在android.app.Activity.onKeyUp(Activity.java:2725)在android.view.KeyEvent.dispatch(KeyEvent.java:2699)在android.app.Activity.dispatchKeyEvent(Activity.java:3026)位于android.support.v7.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:547)在android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrappr.java:57)位于android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDeleateImplBase.java:315)网址:com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:317)在android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4327)在android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4298)在android.view.ViewRootImpl$InputStage.delive(ViewRootImpl.java:3849)在android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902)在android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868)在android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3995)在android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876)在android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4052)在android.view.ViewRootImpl$InputStage.delive(ViewRootImpl.java:3849)在android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902)在android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868)在android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876)在android.view.ViewRootImpl$InputStage.delive(ViewRootImpl.java:3849)在android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902)在android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868)在android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4028)在android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4189)在android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2365)在android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1961)在android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1952)在android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2342)在android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)在android.os.MessageQueue.naturePollOnce(本机方法)在android.os.MessageQueue.next(MessageQueue.java:323)在android.os.Looper.loop(Looper.java:136)在android.app.ActivityThread.main(ActivityThreads.java:6077)位于java.lang.reflect.Method.ioke(本机方法)网址:com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:755)

我知道我可以检查HoraTroceada的长度并防止异常,但我希望以更好的编码行为来完成,捕捉异常。

所以,有人能告诉我这是怎么回事吗?。感谢大家的时间和关注。

要验证空引用,必须使用if语句:

Object ref = null;
if(ref != null) {
System.out.println(ref.toString());
}

而不是使用catch语句

您的代码缺少"运行时异常处理">
查看方式:

String HoraIntroducida = HoraAValidar;

让我们假设,HoraValidar只是"1"。因此HoraIntroducida只持有"1">
长度为1

String[] HoraTroceada = HoraIntroducida.split(":");

由于在上述情况下,HoraTroceada中只有一个元素。

int minuto = HoraTroceada[1].equals("")?-1:Integer.parseInt(HoraTroceada[1]);

在这里,当您的数组中只有一个元素时,您正在访问编号为2的元素。因此,预计会出现运行时错误。

因此,解决方案将是

if(HoraTroceada.length == 1)
int hora = HoraTroceada[0].equals("")?-1:Integer.parseInt(HoraTroceada[0]);
if(HoraTroceada.length == 2)
int minuto = HoraTroceada[1].equals("")?-1:Integer.parseInt(HoraTroceada[1]);

基于您的异常:

java.lang.ArrayIndexOutOfBoundsException:长度=1;index=1

HoraTroceada仅包含一个值。使得长度为1。

所以我们不能访问"HoraTroceada[1]"这个值。

所以在去做之前,首先检查这个字符"-"是否可用像这个

if(HoraIntroducida.contains("-"){
HoraIntroducida = HoraIntroducida.replace("-", ":");
String[] HoraTroceada = HoraIntroducida.split(":");
}

它应该是帮助充分。

在访问索引之前,如果数组的长度大于0,请检查数组的长度,然后访问索引

if(HoraTroceada.length > 0){
int hora = HoraTroceada[0].equals("")?-1:Integer.parseInt(HoraTroceada[0]);
int minuto = HoraTroceada[1].equals("")?-1:Integer.parseInt(HoraTroceada[1]);
}

正如其他答案所表明的那样,您不正确地使用了数组索引。您应该始终测试返回的对象是否符合您的期望。在您的情况下,您期望的是一个大小为2的数组。然后明确此检查并正确处理错误情况。

一般来说,您应该始终检查您调用的方法的输出。您应该适当地处理不一致,比如抛出异常或显示错误消息。检查返回的对象是否为:

  • 不为NULL
  • 不在您要查找的特定范围内
  • 不为空
  • 是正确的类型

如果检测到不一致,则抛出异常并提前退出方法。否则,您可能会将无效数据传递到代码的深层,从而导致数据损坏和未定义的行为。

你可以在我的文章中找到更多关于处理异常的提示:异常指南

最新更新