Java线程和多线程(四)——主线程中的异常
作为Java的开发者,在运行程序的时候会碰到主线程抛异常的情况。如果开发者使用Java的IDE比如Eclipse或者Intellij IDEA的话,可能是不需要直接面对这个问提的,因为IDE会处理运行类来处理这些问题。
下面将描述一些在命令行模式下运行Java程序可能会碰到的异常。
java.lang.UnsupportedClassVersionError
这个异常时因为你的Java类是由另一个其他版本的JDK编译的,但是却在这个版本的命令行下尝试执行。参考下面的例子:
package com.sapphire.util;
public class ExceptionInMain {
public static void main() {
System.out.println(10);
}
}
当我通过Eclipse来创建一个工程的时候,我令其JRE的版本为JavaSE-1.7,但是在我本地终端下的Java版本是JavaSE-1.6。因为IDE的配置的原因,程序在Eclipse中运行的是没什么问题的,但是在终端运行的事后,会出现如下的问题:
ethan@ethan:~/Java7Features/bin$java com/sapphire/util/ExceptionInMain
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/sapphire/util/ExceptionInMain : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
如果在终端通过Java 1.7来执行就不会有这个异常。
java.lang.NoClassDefFoundError
这个异常实际上有两种不同的版本。第一种是开发者提供了类的全名,需要注意的是,当在运行Java程序的时候,开发者仅仅需要提供类的名字而不需要其扩展的.class后缀。如果提供了.class的后缀则会有类似于如下的异常信息:
ethan@ethan:~/CODE/Java7Features/bin$java com/sapphire/util/ExceptionInMain.class
Exception in thread "main" java.lang.NoClassDefFoundError: com/sapphire/util/ExceptionInMain/class
Caused by: java.lang.ClassNotFoundException: com.sapphire.util.ExceptionInMain.class
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
另一种抛出java.lang.NoClassDefFoundError的情况就是该类确实没有找到:
ethan@ethan:~/CODE/Java7Features/bin/com/sapphire/util$java ExceptionInMain
Exception in thread "main" java.lang.NoClassDefFoundError: ExceptionInMain (wrong name: com/sapphire/util/ExceptionInMain)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:480)
需要注意的是类ExceptionInMain在包com.sapphire.util之中,当Eclipse编译这个类的时候,它就会放到目录/com/sapphire/util,所以类要是找不到就会有这个异常的信息。
java.lang.NoSuchMethodError:main
当开发者尝试运行的类中没有main方法就会抛出这个异常。在Java 7之中,错误信息更加清晰易懂:
ethan@ethan:~/CODE/Java7Features/bin$ java com/sapphire/util/ExceptionInMain
Error: Main method not found in class com.sapphire.util.ExceptionInMain, please define the main method as:
public static void main(String[] args)
java.lang.ArithmeticException
当主方法中抛出任何异常的时候,都会将其打印到控制台。第一行显示的是抛出异常的是main方法,之后的部分是异常类的名字,然后在冒号之后,会打印出异常的信息。举例来说,如果我在初始化类的时候敲入代码System.out.println(10/0);,那么就会抛出如下的异常:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.sapphire.util.ExceptionInMain.main(ExceptionInMain.java:6)
前面所描述的这些都是一些常见的主线程中的异常信息。当开发者碰到的时候,最好检查一下如下信息:
- Java程序的编译器版本和JRE运行版本是否兼容
- 运行的Java类所在的目录和package是否匹配
- classpath是否包含了所有的依赖类
- 在通过命令行执行的时候,没有使用
.class后缀来执行java程序 - Java类主方法的语法正确
Java线程和多线程(四)——主线程中的异常的更多相关文章
- Linux 下子线程 exit code 在主线程中的使用
Linux线程函数原型是这样的: void* thread_fun(void* arg) 它的返回值是 空类型指针,入口参数也是 空类型指针.那么线程的 exit code 也应该是 void * 类 ...
- Java多线程--让主线程等待所有子线程执行完毕
数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis() ...
- C#夯实基础之多线程二:主线程、前台线程与后台线程
我们在<C#夯实基础之多线程一:初识多线程>一文中第二部分中指出,既然windows最终发展出了多线程模型,按理说,我们直接使用一个.NetFramework的线程类就可以直接撸代码了,但 ...
- android4.0以上访问网络不能在主线程中进行以及在线程中操作UI的解决方法
MONO 调用一个线程操作UI 然后报Only the original thread that created a view hierarchy can touch its views.错误 goo ...
- 用Handler的post()方法来传递线程中的代码段到主线程中执行
自定义的线程中是不能更新UI的,但是如果遇到更新UI的事情,我们可以用handler的post()方法来将更新UI的方法体,直接传送到主线程中,这样就能直接更新UI了.Handler的post()方法 ...
- Android中,子线程使用主线程中的组件出现问题的解决方法
Android中,主线程中的组件,不能被子线程调用,否则就会出现异常. 这里所使用的方法就是利用Handler类中的Callback(),接受线程中的Message类发来的消息,然后把所要在线程中执行 ...
- Java线程与多线程教程
本文由 ImportNew - liken 翻译自 Journaldev. Java线程是执行某些任务的轻量级进程.Java通过Thread类提供多线程支持,应用可以创建并发执行的多个线程. 应用 ...
- Java 线程总结(十四)
1.在异步任务进程中,一种常见的场景是,主线程提交多个异步任务,然后希望有任务完成就处理结果,并且按任务完成顺序逐个处理,对于这种场景,Java 并发包提供了一个方便的方法,使用 Completion ...
- httpUrlConnection连接网络的用法(用到了handle传递消息,在主线程中更新UI)
由于httpclient在Android5.0以后已经过时,所以官方推荐使用httpUrlConnection来连接网络,现将该连接的基本方法展示,如下 注意:记得加入<uses-permiss ...
随机推荐
- kindeditor 修改上传图片的路径的方法
默认情况下kindeditor上传的图片在编辑器的根目录/attached/目录下.以日期建一个目录,然后保存文件.有些时候大概我们并不想这样.考虑到更新编辑器,或更换编辑器不太方便.比如我现在想把上 ...
- iOS使用TestFlight进行内部和外部人员测试
前言 在iOS 8中,苹果发布了一个叫做TestFlight的新玩意,用于将Beta测试流水化.此前你可能听说过这个东西,因为TestFlight作为一个独立的测试平台已经有些年头了.被苹果收购之后用 ...
- springboot+shiro+cas实现单点登录之cas server搭建
CAS是YALE大学发起的一个开源项目,旨在为web应用系统提供一种可靠的单点登录方法.它主要分为client和server端,server端负责对用户的认证工作,client端负责处理对客户端受保护 ...
- CF1157D N Problems During K Days
思路: 在1, 2, 3, ... , k的基础上贪心构造. 实现: #include <bits/stdc++.h> using namespace std; typedef long ...
- 对flex-grow和flex-shrink的深入理解
flex弹性布局,如果子元素宽度之和大于或者小于父元素宽度,空间就会存在剩余和不够,flex默认不换行,除非设置flex-wrap,那么这种情况下,有两个重要的属性,flex-grow和flex-sh ...
- Godaddy虚拟主机新建mysql数据库 2019最新
第一次用狗爹,完全摸不着路子. 网站本地已搭建,不知道数据库是在哪里上传. 百度搜索结果都是四五年前的旧内容,耽误时间. 还是问客服,Godaddy的客服确实不赖 godaddy虚拟主机如何新建数据库 ...
- Android Doze模式源码分析
科技的仿生学无处不在,给予我们启发.为了延长电池是使用寿命,google从蛇的冬眠中得到体会,那就是在某种情况下也让手机进入类冬眠的情况,从而引入了今天的主题,Doze模式,Doze中文是打盹儿,打盹 ...
- 用指针的方式实现,重写strrchr函数的功能
char *strchrTest(char * ptr,char c); Action(){ char str[]={"thisisadog"}; char c='s'; lr_o ...
- 脚手架创建一个React项目
一.安装 1.安装node.js 官网地址 https://nodejs.org/en/ 进入后点击下载,官方网站会根据你的系统类型推荐最适合你安装的版本.(如果已经安装了node.js跳过此步)如下 ...
- javaweb基础(13)_session防止表单重复提交
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...