[javassist] もしかして制限? switch文のdefault
2008/02/20
java
javassist
javassistです。
バージョンは、3.6.0.GA です。
えーと、switch文でdefaultを使い方によっては制限がありそう。
Exception in thread "main" java.lang.NullPointerException
at javassist.compiler.CodeGen.atSwitchStmnt(CodeGen.java:539)
なんとなくわかったことは、
{ switch (0) {case 1:break;default:break;} }
という書き方はオッケーで、
{ switch (0) {case 1:default:break;} }
はだめっぽい。
caseとdefaultを続けて書くとNG
途中に;に入れるとよい
{ switch (0) {case 1:;default:break;} }
だとオッケーなよう。
以下、確認のためのコード
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;
public class CopyOfTestJavassist {
public static void main(String[] args) throws NotFoundException,
CannotCompileException {
a();
}
static void a() throws NotFoundException, CannotCompileException {
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get("C");
CtMethod method = cc.getDeclaredMethod("m");
StringBuffer buffer = new StringBuffer();
//buffer.append("{ switch (0) {case 1:break;default:break;} }");//OK
//buffer.append("{ switch (0) {case 1:;default:break;} }");//OK
buffer.append("{ switch (0) {case 1:default:break;} }");//NG
method
.setBody(new String(buffer));
cc.toClass();
// Javaでは下記のswitch文は全部OK
switch (0) {case 1:break;default:break;}
switch (0) {case 1:;default:break;}
switch (0) {case 1:default:break;}
}
}
class C{
public void m(){
}
}
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;
public class CopyOfTestJavassist {
public static void main(String[] args) throws NotFoundException,
CannotCompileException {
a();
}
static void a() throws NotFoundException, CannotCompileException {
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get("C");
CtMethod method = cc.getDeclaredMethod("m");
StringBuffer buffer = new StringBuffer();
//buffer.append("{ switch (0) {case 1:break;default:break;} }");//OK
//buffer.append("{ switch (0) {case 1:;default:break;} }");//OK
buffer.append("{ switch (0) {case 1:default:break;} }");//NG
method
.setBody(new String(buffer));
cc.toClass();
// Javaでは下記のswitch文は全部OK
switch (0) {case 1:break;default:break;}
switch (0) {case 1:;default:break;}
switch (0) {case 1:default:break;}
}
}
class C{
public void m(){
}
}
: