web项目异常总结
前言
这周的考核任务是写一个类似图片素材网的网站,说实话Servlet和会话都学的比较浅,写这个项目的时候异常也都是层出不穷,每个异常基本都耗费了几个小时去查找资料,去改。虽然很浪费时间,但也收获了不少的东西,写这篇博客记录一下我解决异常中学到的知识。
一、java.lang.ClassNotFoundException找不到类异常
这类异常一般是没有导入正确的jar包,解决此类异常分两步:
1、查看自己是否导入了正确的jar包
2、查看自己的导入jar包的lib目录是否放在了WEB-INF目录下
WEB-INF目录是一个静态资源库,客户端无法访问,但浏览器可以访问到的库。
而且如果lib没有正确放在WEB-INF目录下的话,代码底层new出service对象时会抛出一个初始化异常:ExceptionInInitializerError
二、Xx.class.getClassLoader().getResource()出现空指针异常
这个异常是调用数据库连接池时加载德鲁伊配置文件出的异常,原代码如下
package jdbcutils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.*;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class JdbcUtils {
private static DataSource ds;
static{
Properties properties = new Properties();
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(new File("druid.properties"));//出现异常
properties.load(inputStream);
ds = DruidDataSourceFactory.createDataSource(properties);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}finally{
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static DataSource getDs(){
return ds;
}
public static Connection getConn() throws SQLException{
return ds.getConnection();
}
}
如果引用文件是null的话,会报出空指针异常,那么思路就是,要么我的druid.properties文件里是null,要么我就根本没找到druid.properties文件,前者显然是不对的,那么就只有后者这一种可能。
为什么我会找不到配置文件呢?先看看以下代码
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class JDBCUtils {
public static void main(String[] args){
//加载配置文件,初始化连接池
Properties properties = new Properties();
InputStream ips = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(ips);
//初始化连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(properties);
}
}
以上代码在IDEA运行完全没有问题,但到了tomcat上就会爆出空指针异常,由此可知,tomcat加载资源的方式并不相同。于是我们去查找out目录(存放.class文件的目录),发现并没有找到druid.properties配置文件,所以我们需要将druid.properties配置文件加载到out目录中。方法就是将该文件放在resources目录下。
三、404找不到资源
出现这个异常的解决方法比前两个简单,步骤:
1、查看地址名,是否缺‘/’,是否写错,检查虚拟路径是否有问题
2、检查目标资源路径,如果放在web目录的子包下,要将包名加上
3、查看out目录中对应文件以及包名是否存在问题
我遇到的一个问题就是out目录下的servlet包有两个,系统自动将第二个改成了Servlet,导致我访问不到里面的资源,更改包名后恢复。