プログラマメモ2 - programmer no memo2

[javassist] もしかして制限? switch文のdefault 2008/02/20

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(){

}
}

: