使用可调用函数来传递两个参数并返回参数数组

3

我需要将两个字符串传递给一个线程,该线程将返回包含这两个字符串的数组,并且我必须使用callable函数。

以下是我目前的代码:

public class toArray implements Callable<String[]> {

private String string1 string2;

public toArray (String first, String second)
{
    string1= first;
    string2 = second;
}

    @Override
    public String[] call() throws Exception {
        String [] allStrings = null;
            allStrings[0] = string1;
            allStrings[1] = string2;
        return allStrings;
    }
}

以下是主要内容:
public class theFuntion{

    public static void main(String[] args) {


        FutureTask<String[]> task = new FutureTask (new MyCallable());
        ExecutorService es = Executors.newSingleThreadExecutor();
        es.submit (task);
        try{
               String[] result = task.get();
               System.out.println(result[1] + result[2]);
           }
        catch(Exception e){
                           System.err.println(e);
    }
         es.shutdown();
}

问题出在main函数中:它说期望一个String[]类型的结果,但是实际上得到的是一个对象。如果我强制转换结果,它会提示必须声明抛出异常。

1
你是否遇到任何错误或奇怪的行为? - Radu Murzea
1
我立即注意到的一个问题是,您在方法签名中没有声明将返回String[],尽管您仍然试图这样做。 - Makoto
1
另一个问题是allStrings被初始化为null,然后被重复使用。你可能想要的是String [] allStrings = new String[2] - Vic
这并不是一个错误(但如果你想听我的意见,应该是):Java中的类名应该以大写字母开头。因此应该是 ToArray 而不是 toArray - biziclop
我遇到的问题在主函数中:它说result期望一个String[],但是它得到了一个对象。如果我强制转换result,它会说必须声明抛出异常。 - Ryan
3个回答

4

将类的签名更改为

public class toArray implements Callable<String[]>

并将call方法的签名更改为

public String[] call() throws Exception

更新: 好的,有不止一个错误... 看下面的工作示例

public class Test{

    public static void main(String[] args) {


        FutureTask<String[]> task = new FutureTask(new MyCallable("a", "b"));
        ExecutorService es = Executors.newSingleThreadExecutor();
        es.submit (task);
        try{
            String[] result = task.get();
            System.out.println(result[0] + result[1]);
        }
        catch(Exception e){
            System.err.println(e);
        }
        es.shutdown();
    }

    public static class MyCallable implements Callable<String[]>
    {

        private String string1, string2;

        public MyCallable (String first, String second)
        {
            string1= first;
            string2 = second;
        }

        @Override
        public String[] call() throws Exception {
            String [] allStrings = new String[2];
            allStrings[0] = string1;
            allStrings[1] = string2;
            return allStrings;
        }
    }
}

有异常吗?你是否将“allStrings = null”的初始化更改为“allStrings = new String [2]”?并将类名“toArray”更改为“MyCallable”? - Sal

2
Callable<V> 中,参数化类型 V 代表 call() 的结果类型。由于你想要返回一个 String[],所以应该使用 Callable<String[]> 而不是 Callable<String>。然后,将 call 的返回类型更改为 String[]
@Override
public String[] call() throws Exception {
    String [] allStrings = new String[2];
    allStrings[0] = string1;
    allStrings[1] = string2;
    return allStrings;
}

顺便提一下,在Java中,类名应该是名词,并且应该以大写字母开头。

然后,将调用的返回类型更改为String[]:例如返回allStrings[]; ??? - Ryan
@Ryan:不是,返回类型就在public访问器之后。你可以用public String[] call代替public String call。这样一来,你就把返回类型从String改为了String[]。 - João Silva
你的代码中还有许多其他错误。例如,new MyCallable()是什么?难道不应该是new toArray("some string", "otherString")吗?此外,请使用new FutureTask<String[]>private String string1 string2;也是无效的,可以用逗号将两个变量分开private String string1, string2;或者使用两个不同的语句。最后,在Java中,数组是从0开始索引的,因此第一个位置是[0]而不是[1]。 - João Silva

1

您在TheFunction中没有引用ToArray类,可能是由于编译错误(提示:已经提到了修复方法)。

您的新FutureTask将如下所示:

FutureTask<String[]> task = new FutureTask(new ToArray("foo", "bar"));

在不直接告诉你答案的情况下,你会在ToArray方法中的call()方法中遇到两个异常:

  • 首先,你的字符串数组从未被初始化,但是应该被初始化。
  • 所有的数组都从零开始。

我已经进行了编辑:FutureTask <String []> task = new FutureTask(new ToArray(“foo”,“bar”));非常感谢,但仍然没有改变。 - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接