Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中初始化字符串的大小_Java_Compiler Construction_Javac - Fatal编程技术网

java中初始化字符串的大小

java中初始化字符串的大小,java,compiler-construction,javac,Java,Compiler Construction,Javac,显然,javac中初始化字符串的大小是有限制的。有人能帮我确定最高限额是多少吗 多谢各位 编辑: 我们正在构建一个初始化字符串,它看起来像“{1,2,3,4,5,6,7,8……”,但理想情况下是10000个数字。当我们对1000执行此操作时,10000会抛出一个错误,表示代码对于try语句来说太大 为了实现这一点,我们使用一个stringbuilder并在附加值的数组上循环。显然,这是javac中的一个限制。我们被告知,如果我们将数组分块传递,我们可以用调用的方法重建数组。但是,这是不可能的,因

显然,javac中初始化字符串的大小是有限制的。有人能帮我确定最高限额是多少吗

多谢各位

编辑:

我们正在构建一个初始化字符串,它看起来像“{1,2,3,4,5,6,7,8……”,但理想情况下是10000个数字。当我们对1000执行此操作时,10000会抛出一个错误,表示代码对于try语句来说太大

为了实现这一点,我们使用一个stringbuilder并在附加值的数组上循环。显然,这是javac中的一个限制。我们被告知,如果我们将数组分块传递,我们可以用调用的方法重建数组。但是,这是不可能的,因为我们无法控制正在调用的用户方法

我想发布代码,但不能,因为这是一个大学项目。我不是在寻找代码解决方案,只是在理解这里的实际问题时寻求一些帮助

这是犯规的人

    Object o = new Object() 
    { 
        public String toString() 
        { 
            StringBuilder s = new StringBuilder();
            int length = MainInterfaceProcessor.this.valuesFromData.length;
            Object[] arrayToProcess = MainInterfaceProcessor.this.valuesFromData;

            if(length == 0)
            {
                //throw exception to do
            }
            else if(length == 1)
            {
                s.append("{" + Integer.toString((Integer)arrayToProcess[0])+"}");
            }
            else
            {
                s.append("{" + Integer.toString((Integer)arrayToProcess[0])+","); //opening statement
                for(int i = 1; i < length; i++)
                {
                    if(i == (length - 1))
                    {
                        //last element in the array so dont add comma at the end
                        s.append(getArrayItemAsString(arrayToProcess, i)+"}");
                        break;
                    }       
                    //append each array value at position i, followed
                    //by a comma to seperate the values
                    s.append(getArrayItemAsString(arrayToProcess, i)+ ",");
                }
            }
            return s.toString();
        }
    };
    try 
    {
        Object result = method.invoke(obj, new Object[] { o });
Object o=新对象()
{ 
公共字符串toString()
{ 
StringBuilder s=新的StringBuilder();
int length=main接口处理器.this.values fromdata.length;
对象[]arrayToProcess=MainInterfaceProcessor.this.valuesFromData;
如果(长度==0)
{
//抛出异常来做什么
}
else if(长度==1)
{
s、 追加(“{Integer.toString((Integer)arrayToProcess[0])+”}”);
}
其他的
{
s、 追加(“{”+整数.toString((整数)arrayToProcess[0])+”,”;//开始语句
for(int i=1;i

}如果类型是number max length=Integer.max_VALUE,如果类型是char max length=65536

字符串长度受限制字符串文本的长度(即
“…”
)受类文件格式的结构限制,该结构由
常量字符串信息
结构引用

CONSTANT_Utf8_info {
    u1 tag;
    u2 length;
    u1 bytes[length];
}
这里的限制因素是
length
属性,它只有2个字节大,即最大值为65535。 此数字对应于字符串的修改UTF-8表示形式中的字节数(实际上几乎是,但0字符也以双字节形式表示)

因此,纯ASCII字符串文字最多可以包含65535个字符,而由U+0800…U+FFFF范围内的字符组成的字符串只能包含其中的三分之一。在UTF-8中编码为代理项对的那些(即U+10000到U+10FFFF)每个占用6字节

(标识符也有相同的限制,即类、方法和变量名,以及它们的类型描述符,因为它们使用相同的结构。)

Java语言规范未提及以下方面的任何限制:

字符串文字由零个或多个用双引号括起来的字符组成

因此,原则上,编译器可以将较长的字符串文本拆分为多个
常量字符串\u info
结构,并在运行时通过串联(和
.intern()
-ing结果)对其进行重构。我不知道是否有编译器真的在这样做


它表明问题与字符串文字无关,而是与数组初始值设定项有关

将对象传递给(类似于BConstructor.newInstance)时,它可以是一个对象(即,围绕现有对象的包装器,然后它将传递包装对象)、一个字符串(将按原样传递)或其他任何内容。在最后一种情况下,对象将转换为字符串(通过
toString()
),然后将该字符串解释为Java表达式

为此,BlueJ将把这个表达式包装在一个类/方法中并编译这个方法。在该方法中,数组初始值设定项被简单地转换为一长串数组赋值。。。这最终使该方法比Java方法的长度更长:

代码长度项的值必须小于65536

这就是为什么它会中断较长的阵列


因此,要传递更大的数组,我们必须找到其他方法将它们传递给BMethod.invoke。BlueJ扩展API无法创建或访问封装在BOObject中的数组

我们在聊天中发现的一个想法是:

  • 在项目内部(或者在新项目中,如果可以互操作的话)创建一个新类,如下所示:

    public class IntArrayBuilder {
        private ArrayList<Integer> list;
        public void addElement(int el) {
            list.add(el);
        }
        public int[] makeArray() {
            int[] array = new int[list.size()];
            for(int i = 0; i < array.length; i++) {
               array[i] = list.get(i);
            }
            return array;
        }
    }
    
    (为了提高效率,BClass/BMethod对象实际上可以检索一次并缓存,而不是每次数组转换一次。)
    如果通过某种算法生成数组内容,则可以在此处生成,而不是首先创建另一个包装对象

  • 在我们的扩展中,调用我们实际想要用长数组调用的方法,传递我们的包装数组:

    Object result = method.invoke(obj, new Object[] { bArray });
    

  • 你到底是什么意思,命令行的长度?命令行参数?字符串的最大大小?这又有什么关系呢?因为我正在为一个名为bluej的软件(基于学生的ide)开发一个插件。对于远程调用方法,您必须构建一个初始化字符串,然后由我试图使用数组调用的方法解析该字符串。大型阵列失败,因为初始值为
    Object result = method.invoke(obj, new Object[] { bArray });