【问题标题】:Netbeans, red text but no errorNetbeans,红色文本但没有错误
【发布时间】:2014-11-10 00:39:42
【问题描述】:

我正在尝试为餐饮哲学家实施解决方案。不确定我是否做得对。我的程序没有崩溃,但输出中出现红色文本,但没有错误代码。

错误示例:

在 (package_name).Phil.getrightFork(Phil.java:70) 第 70 行和第 46 行之间的错误替代项(即调用 getrightFork 的行)

我已经用 getleftFork 交换了 getrightFork,但它总是选择 rightFork 作为错误

这是我正在使用的代码: 自定义信号量:

public class Semaphore {
public int value= 0 ;
public Semaphore(int value) {
    this.value = value;
}
public synchronized void up() { //notify must be syncrhonized
    value++;
    if (value > 0){
        this.notifyAll();
    }
}
public synchronized void down() throws InterruptedException {

    while (value <= 0){//Check if resource is avaiable, if not WAIT.
      this.wait();
    }
    value--; // Value is no longer negative
}}

主要:

public class main {

private static final int N = 10000;

public static void main(String[] args) throws InterruptedException{

    Phil[] phils = new Phil[N];
    Semaphore[] forks = new Semaphore[N];
    for (int i=0;i<N;i++){
      forks[i] = new Semaphore(1);
      phils[i] = new Phil(i, forks, N);
      phils[i].start();
    }
    for (int i=0;i<N;i++){
        phils[i].join();
    }
}}

菲尔班:

 public class Phil extends Thread {

  Semaphore fork[]; 
  int phil, total, left, right;
  boolean leftFork = false, rightFork = false;

public Phil(int spot ,Semaphore[] s, int N){

   phil = spot;
   left = spot;
   fork = s;
   switch(spot){
       case 0: 
           right = N-1;
               break;
       default:
           right = spot - 1;
           break;
   }

}

public void run(){

    System.out.println("I am Phil " + phil + " my left fork is " + left + " my right fork is " + right);
 while(true){
 try {
  if (phil%2 == 0){
      Thread.sleep(10); // Let the odd Phils eat first
  }   
  getrightFork();

  if (rightFork){
      getleftFork();
  }

  if (leftFork && rightFork){
      eat();
      retleftFork();
      retrightFork();
  }
  Thread.sleep(10);

 } catch (InterruptedException ex) {

 }
}
}
void getleftFork() throws InterruptedException{
    fork[left].down();
    //System.out.println("I got my left fork!");
    leftFork = true;
}
 void getrightFork() throws InterruptedException{
    fork[right].down();
    //System.out.println("I got my right fork!");
    rightFork = true;
}

void retleftFork(){
    fork[left].up();
    leftFork = false;

}

void retrightFork(){
    fork[right].up();
    rightFork = false;
}

void eat(){
    System.out.println("Phil:" + phil + " ate");
}}

【问题讨论】:

  • 您收到的是NullPointerException?您尝试访问的数组中的元素是null...是时候破解旧的调试器并逐步执行您的代码了...
  • 感谢您指出这一点。你怎么知道它是一个 NullPointerException 呢?每当我运行它时,它只是指向一条线。
  • 它打印出NullPointerException,然后转储堆栈跟踪。您需要返回输出以查找错误原因(红线)

标签: java netbeans dining-philosopher


【解决方案1】:

您将收到NullPointerException。您尝试访问的数组中的元素是null

这是由于你start你的Phil在整个数组完成之前造成的...

Phil[] phils = new Phil[N];
Semaphore[] forks = new Semaphore[N];
for (int i = 0; i < N; i++) {
    forks[i] = new Semaphore(1);
    phils[i] = new Phil(i, forks, N);
    // Phil is starting, but how many phils are there??
    phil.start();
}

相反,尝试先填充数组,然后在单独的循环中启动它们...

Phil[] phils = new Phil[N];
Semaphore[] forks = new Semaphore[N];
for (int i = 0; i < N; i++) {
    forks[i] = new Semaphore(1);
    phils[i] = new Phil(i, forks, N);
}
for (Phil phil : phils)  {
    phil.start();
}
for (int i = 0; i < N; i++) {
    phils[i].join();
}

如果解决方案要求Phil在创建后立即启动,那么您需要更改检查代码以处理下一个元素可能是null的情况

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 2020-01-02
    • 2021-09-29
    • 2019-08-07
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    相关资源
    最近更新 更多