我对这两个决策树的不同之处感到非常困惑。我正在构建一个应用程序,需要根据从ListView中选择的位置来决定加载哪个视图。我试图将逻辑构建到单个控制器模块中,并发现switch-case将导致NullPointerException和FC,而if-else将完美地工作。任何人都可以告诉我为什么?我有很强的C和C ++背景,并且习惯于能够轻松地将开关重新写入if-else,反之亦然。
定义的变种:
private final int VALUEA = 0;
private final int VALUEB = 1;
private final int VALUEC = 2;
切换情况:
TextView t = new TextView(null);
switch(value){
case VALUEA:
setContentView(R.layout.valuealayout);
t = (TextView) findViewById(R.id.valuealayout);
t.findViewById(R.id.valuealayout);
break;
case VALUEB:
setContentView(R.layout.valueblayout);
t = (TextView) findViewById(R.id.valueblayout);
t.findViewById(R.id.valueblayout);
break;
case VALUEC:
setContentView(R.layout.valueclayout);
t = (TextView) findViewById(R.id.valueclayout);
t.findViewById(R.id.valueclayout);
break;
default:
break;
}
上面的块将导致NullPointerException。
如果 - 否则:
if(value == VALUEA ){
setContentView(R.layout.valuealayout);
TextView t = (TextView) findViewById(R.id.valuealayout);
t.findViewById(R.id.valuealayout);
}else if(value == VALUEB){
setContentView(R.layout.valueblayout);
TextView t = (TextView) findViewById(R.id.valueblayout);
t.findViewById(R.id.valueblayout);
}else if(value == VALUEC){
setContentView(R.layout.valueclayout);
TextView t = (TextView) findViewById(R.id.valueclayout);
t.findViewById(R.id.valueclayout);
}else{
}
此版本完美无缺。第二个块是否起作用是因为一些时髦的Java作用域规则允许决策树的每个分支以第一个块没有的方式创建和正确初始化TextView?
答案 0 :(得分:3)
TextView
构造函数需要Context
。你不能只是传递它null
。而是做:
TextView t = null;
switch(value){
case VALUEA:
setContentView(R.layout.valuealayout);
t = (TextView) findViewById(R.id.valuealayout);
t.findViewById(R.id.valuealayout);
break;
case VALUEB:
setContentView(R.layout.valueblayout);
t = (TextView) findViewById(R.id.valueblayout);
t.findViewById(R.id.valueblayout);
break;
case VALUEC:
setContentView(R.layout.valueclayout);
t = (TextView) findViewById(R.id.valueclayout);
t.findViewById(R.id.valueclayout);
break;
default:
break;
}
答案 1 :(得分:1)
我猜这是行
TextView t = new TextView(null);
这就是问题所在。将null传递给TextView
构造函数是否合法?
如果没有看到堆栈跟踪,这只是在黑暗中刺伤。