欢迎使用Markdown编辑器
public class OrderPizza {
public OrderPizza() {
Pizza pizza=null;
String type = this.getType();
if (type == "cheese") {
pizza = new CheesePizza();
pizza.setName("希腊披萨");
} else if (type == "prepper") {
pizza = new PrepperPizza();
pizza.setName("胡椒披萨");
}
pizza.prepare();
pizza.box();
}
在调试工程模式发现了,空指针异常的情况,最后是发现在引用类型变量使用了==进行boolen运算,基础不牢,地动山摇。应该使用equal方式进行比较
public class OrderPizza {
public OrderPizza() {
Pizza pizza=null;
String type = this.getType();
if (type.equals("cheese") ) {
pizza = new CheesePizza();
pizza.setName("希腊披萨");
} else if (type.equals("prepper")){
pizza = new PrepperPizza();
pizza.setName("胡椒披萨");
}
pizza.prepare();
pizza.box();
}
改成equals 进行比较后,问题解决
public class OrderPizza {
public OrderPizza() {
// Pizza pizza=null;
String type = this.getType();
if (type.equals("cheese") ) {
Pizza pizza = new CheesePizza();
pizza.setName("希腊披萨");
} else if (type.equals("prepper")){
Pizza pizza = new PrepperPizza();
pizza.setName("胡椒披萨");
}
pizza.prepare();
pizza.box();
}
在条件语句中,定义了局部变量,在循环的大括号外面使用会报错,这是因为条件语句的作用域是其大括号的范围。
所有不要只知道,方法中才存在局部变量的作用域的问题,条件以及循环语句中同样存在局部变量的作用域,需要知道
把局部变量定义在循环体外部,问题解决
public class OrderPizza {
public OrderPizza() {
Pizza pizza=null;
String type = this.getType();
if (type.equals("cheese") ) {
pizza = new CheesePizza();
pizza.setName("希腊披萨");
} else if (type.equals("prepper")){
pizza = new PrepperPizza();
pizza.setName("胡椒披萨");
}
pizza.prepare();
pizza.box();
}
例2 closeResource(connection,preparedStatement) 这句报错 preparedStatement无法取到,因为前面的preparedStatement声明在了try的大括号内,作用域只是在这个大括号内,finally的大括号无法取到,修正方法:需要把preparedStatement声明在try的外部。
public class CRUDTest {
@Test
public void insertTest() {
// 1 获取连接
Connection connection = null;
try {
connection = getConnection();
// 2 编制sql语句
String sql="INSERT INTO customers (name,email,birth) VALUES(?,?,?)";
// 3 获取PreparedStatement对象,预编译sql语句
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 4 填充占位符
preparedStatement.setObject(1, "饺子");
preparedStatement.setObject(2,"jiaozi@sina.com" );
preparedStatement.setObject(3,"1980-01-01" );
// 5 执行sql语句
preparedStatement.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
closeResource(connection,preparedStatement)
}
}
更正后的结果
public void insertTest() {
// 1 获取连接
Connection connection = null;
PreparedStatement preparedStatement=null;
try {
connection = getConnection();
// 2 编制sql语句
String sql="INSERT INTO customers (name,email,birth) VALUES(?,?,?)";
// 3 获取PreparedStatement对象,预编译sql语句
preparedStatement = connection.prepareStatement(sql);
// 4 填充占位符
preparedStatement.setObject(1, "饺子");
preparedStatement.setObject(2,"jiaozi@sina.com" );
preparedStatement.setObject(3,"1980-01-01" );
// 5 执行sql语句
preparedStatement.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
closeResource(connection,preparedStatement);
}
}
这里可以参考这篇文章:
Java之局部变量的作用域(包括循环语句条件语句的局部变量的作用域,非常经典)