【问题标题】:unhandled exception: java.lang.ClassNotFoundException Error未处理的异常:java.lang.ClassNotFoundException 错误
【发布时间】:2015-07-09 02:07:48
【问题描述】:

我有以下类代码,在调试时它一直显示以下错误:

1.) 未处理的异常:java.lang.ClassNotfoundException 2.) 未处理异常:java.lang.NoSuchMethodException

错误日志:

 /apps/robotapp/Utils.java:32: error: exception IOException is never thrown in body of corresponding try statement
    } catch (IOException e) {
      ^
 /apps/robotapp/Utils.java:24: error: unreported exception ClassNotFoundException; must be caught or declared to be thrown
        final int tckName = Class.forName("libcore.io.OsConstants").getField("_SC_CLK_TCK").getInt(null);
                                         ^
/apps/robotapp/Utils.java:24: error: unreported exception NoSuchFieldException; must be caught or declared to be thrown
        final int tckName = Class.forName("libcore.io.OsConstants").getField("_SC_CLK_TCK").getInt(null);
                                                                            ^
/apps/robotapp/Utils.java:24: error: unreported exception IllegalAccessException; must be caught or declared to be thrown
        final int tckName = Class.forName("libcore.io.OsConstants").getField("_SC_CLK_TCK").getInt(null);
                                                                                                  ^
/apps/robotapp/Utils.java:25: error: unreported exception ClassNotFoundException; must be caught or declared to be thrown
        final Object os = Class.forName("libcore.io.Libcore").getField("os").get(null);
                                       ^
/apps/robotapp/Utils.java:25: error: unreported exception NoSuchFieldException; must be caught or declared to be thrown
        final Object os = Class.forName("libcore.io.Libcore").getField("os").get(null);
                                                                      ^
/apps/robotapp/Utils.java:25: error: unreported exception IllegalAccessException; must be caught or declared to be thrown
        final Object os = Class.forName("libcore.io.Libcore").getField("os").get(null);
                                                                                ^
/apps/robotapp/Utils.java:26: error: unreported exception NoSuchMethodException; must be caught or declared to be thrown
        final long tck = (Long)os.getClass().getMethod("sysconf", Integer.TYPE).invoke(os, tckName);
                                                      ^
/apps/robotapp/Utils.java:26: error: unreported exception IllegalAccessException; must be caught or declared to be thrown
        final long tck = (Long)os.getClass().getMethod("sysconf", Integer.TYPE).invoke(os, tckName);



  ^
 Note:         
 /RobotService.java uses or overrides a deprecated API.
  Note: Recompile with -Xlint:deprecation for details.
  9 errors

  FAILED

有错误的代码片段:

try {
        final String[] fields = stat.substring(stat.lastIndexOf(field2End)).split(fieldSep);
        final long t = Long.parseLong(fields[fieldStartTime]);
        final int tckName = Class.forName("libcore.io.OsConstants").getField("_SC_CLK_TCK").getInt(null);
        final Object os = Class.forName("libcore.io.Libcore").getField("os").get(null);
        final long tck = (Long)os.getClass().getMethod("sysconf", Integer.TYPE).invoke(os, tckName);
        return t * msInSec / tck;
    } catch (final NumberFormatException e) {
        throw new IOException(e);
    } catch (final IndexOutOfBoundsException e) {
        throw new IOException(e);
    } catch (IOException e) {
        throw new IOException(e);
    }

【问题讨论】:

  • 您的代码似乎丢失了一半(没有可见的 catch 块)。
  • @MattClark 是的,我知道。我在问如何纠正它

标签: android class exception exception-handling


【解决方案1】:

您必须添加所有异常或使用全部捕获:

try {
} catch(Exception exp) { }

更正后的代码:

try {
    final String[] fields = stat.substring(stat.lastIndexOf(field2End)).split(fieldSep);
    final long t = Long.parseLong(fields[fieldStartTime]);
    final int tckName = Class.forName("libcore.io.OsConstants").getField("_SC_CLK_TCK").getInt(null);
    final Object os = Class.forName("libcore.io.Libcore").getField("os").get(null);
    final long tck = (Long)os.getClass().getMethod("sysconf", Integer.TYPE).invoke(os, tckName);
    return t * msInSec / tck;
} catch (final NumberFormatException e) {
    throw new IOException(e);
} catch (final IndexOutOfBoundsException e) {
    throw new IOException(e);
} catch (java.lang.ClassNotfoundException e) {
    throw new IOException(e);
} catch (java.lang.NoSuchMethodException e) {
    throw new IOException(e);
} catch (IllegalAccessException e) {
    throw new IOException(e);
}

您捕获的 IOException 也被删除,因为它(根据调试器)从未被抛出。

【讨论】:

  • 或者替代方案: public void functionName() throws Exception { } 那么你不必在那里捕获它们。他们将不得不被抓到某个地方,因为他们只是被委派给调用函数。
【解决方案2】:

将您的代码更改为

try {
   //do something
} catch (Exception e) {
   e.printStackTrace();
   //throw new Exception("Error occured");
}

try {
    final String[] fields = stat.substring(stat.lastIndexOf(field2End)).split(fieldSep);
    final long t = Long.parseLong(fields[fieldStartTime]);
    final int tckName = Class.forName("libcore.io.OsConstants").getField("_SC_CLK_TCK").getInt(null);
    final Object os = Class.forName("libcore.io.Libcore").getField("os").get(null);
    final long tck = (Long)os.getClass().getMethod("sysconf", Integer.TYPE).invoke(os, tckName);
    return t * msInSec / tck;
} catch (ClassNotFoundException|NoSuchFieldException|IllegalAccessException|NoSuchMethodException e) {
    throw e;
} 

干净多了,对吧?

【讨论】:

    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多