私はコンソールから動作する電卓プログラムに取り組んでいます。これは、インライン関数の作成もサポートするはずです。たとえばinline _FOO{a1, a2} a1 + a2
、関数を宣言し、呼び出し_FOO{2,3}
は 2 + 3 を返す必要があります。すべての解析と計算を行うために Converter クラスを使用しています。プログラムのデフォルト関数の実装を保持する同じパッケージに InlineFunction というクラスを作成しました。これらはすべて正常に動作しますが、インライン関数を呼び出そうとするとエラーが発生します。デバッグ中に、実際に新しいインライン関数を宣言する部分までプログラムが正常に動作すると、InlineFunction function = new InlineFunction();
すぐに ClassNotFoundException が発生することに気付きました。その関数は他の動作中の関数と同じパッケージにあり、パッケージ全体を Converter クラスにインポートするため、理由がわかりません。
編集: InlineFunction のコード:
package oop.ex2.functions;
import java.util.LinkedHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import oop.ex2.main.UndeclaredVariableException;
public class InlineFunction implements Calculable {
//Regular expression for finding a variable name.
private static final String VARIABLE_NAME_REGEX = "@[a-z0-9]+";
//Pattern for finding a variable name.
private static final Pattern VARIABLE_NAME = Pattern.compile(VARIABLE_NAME_REGEX);
private LinkedHashMap<String, Double> _parameters;
private String _code;
public InlineFunction(String code, String[] parameters) {
_parameters = new LinkedHashMap<String, Double>();
_code = code;
for (String name: parameters) {
_parameters.put(name, 0d);
}
}
@Override
public String calculate(Double[] parameters) {
if (parameters.length != _parameters.size()) {
throw new IllegalParameterNumberException();
}
int parameterIndex = 0;
for (String key: _parameters.keySet()){
_parameters.put(key, parameters[parameterIndex]);
}
_code = replaceParameters(_code);
return _code;
}
private String replaceParameters(String expression) {
Matcher variableName = VARIABLE_NAME.matcher(expression);
while (variableName.find()) {
if (_parameters.containsKey(variableName.group())) {
expression = variableName.replaceFirst(_parameters.get(variableName.group()).toString());
//Reset the matcher, since the expression was changed
variableName = VARIABLE_NAME.matcher(expression);
} else {
throw new UndeclaredVariableException();
}
}
return expression;
}
}