2014-01-17 4 views
-2
public class leftrec { 

static int isleft(String[] left,String[] right) 

    { 
     int f=0; 
     for(int i=0;i<left.length;i++) 
     { 
      for(int j=0;j<right.length;j++) 

      { 
       if(left[i].charAt(0)==right[j].charAt(0)) 
       { 
        System.out.println("Grammar is left recursive"); 
        f=1; 
       } 

      } 
     } 
      return f; 
    } 
    public static void main(String[] args) { 
     // TODO code application logic here 
     String[] left=new String[10]; 
     String[] right=new String[10]; 
     Scanner sc=new Scanner(System.in); 
     System.out.println("enter no of prod"); 
     int n=sc.nextInt(); 
     for(int i=0;i<n;i++) 
     { 
      System.out.println("enter left prod"); 
      left[i]=sc.next(); 
      System.out.println("enter right prod"); 
      right[i]=sc.next(); 
     } 

     System.out.println("the productions are"); 
     for(int i=0;i<n;i++) 
     { 
      System.out.println(left[i]+"->"+right[i]); 
     } 
     int flag=0; 
     flag=isleft(left,right); 
      if(flag==1) 
      { 
       System.out.println("Removing left recursion"); 
      } 
      else 
      { 
       System.out.println("No left recursion"); 
      }  
    } 
} 

Я написал этот код, чтобы узнать, оставлена ​​ли данная грамматика рекурсивной или нет. Когда я скомпилировать программу она дает мне NullPointerException в строкахУдаление NullPointerException в Java

if(left[i].charAt(0)==right[j].charAt(0)) 

и

isleft(left,right); 

Как удалить исключение?

+0

имя класса должно начинаться с заглавной буквой – lakshman

+0

Использования Java конвенции кодирования, чтобы определить свой класс. имя класса должно быть в Case Camel. –

+0

Когда вы скомпилируете код? Или запустите код? –

ответ

2

Я думаю, проблема с вашими входами, Вы просто принимая длину массива строк как 10.

String[] left=new String[10]; 
String[] right=new String[10]; 

Dont жёстко длина строки массива

int n=sc.nextInt(); 
String[] left=new String[n]; 
String[] right=new String[n]; 
for(int i=0;i<n;i++){ 
    System.out.println("enter left prod"); 
    left[i]=sc.next(); 
    System.out.println("enter right prod"); 
    right[i]=sc.next(); 
} 

Может, это будет проблема

+0

проверил это, и вы правы –

0

Вы должны изменить код следующим образом ::

package com.cgi.ie2.common; 

import java.util.Scanner; 

public class LeftRecursive { 

static int isleft(String[] left, String[] right) 
{ 
    int f = 0; 
    for (int i = 0; i < left.length; i++) { 
     for (int j = 0; j < right.length; j++) 
     { 
      if (left[i].charAt(0) == right[j].charAt(0)) { 
       System.out.println("Grammar is left recursive"); 
       f = 1; 
      } 
     } 
    } 
    return f; 
} 

public static void main(String[] args) { 
    // TODO code application logic here 
    Scanner sc = new Scanner(System.in); 
    System.out.println("enter no of prod"); 
    int n = sc.nextInt(); 
    //Changes done here:::: 
    String[] left = new String[n]; 
    String[] right = new String[n]; 
    for (int i = 0; i < n; i++) { 
     System.out.println("enter left prod"); 
     left[i] = sc.next(); 
     System.out.println("enter right prod"); 
     right[i] = sc.next(); 
    } 

    System.out.println("the productions are"); 
    for (int i = 0; i < n; i++) { 
     System.out.println(left[i] + "->" + right[i]); 
    } 
    int flag = 0; 
    flag = isleft(left, right); 
    if (flag == 1) { 
     System.out.println("Removing left recursion"); 
    } else { 
     System.out.println("No left recursion"); 
    } 
} 
    } 

Этот код устранит NullpointerExceptions

Если вы получаете нет. из прода с консоли, струна массивы необходимо установить соответственно, для этого изменения я сделал является ::

System.out.println("enter no of prod"); 
    int n = sc.nextInt(); 
    //Changes done here:::: 
    String[] left = new String[n]; 
    String[] right = new String[n]; 

И для лучших кодов, что я могу предложить вам, вы должны соблюдать основные правила кодирования, которые делает ваши коды для чтения, коды не являются идеальными, только если он работает corectly, коды совершенны, если а правила кодирования, которые следуют, пожалуйста, перейдите по следующим ссылкам, чтобы undestand основной идеи кодирования конвенций ::

http://www.javacodegeeks.com/2012/10/java-coding-conventions-considered-harmful.html http://java.about.com/od/javasyntax/a/nameconventions.htm

0

вы не можете инициализировать массив без si зе. Вы уже указали размеры массива как 10, и если вы вводите продукты, размер которых превышает 10 или меньше 10, вы получите ошибки. Если вы хотите использовать динамический размер, вы должны использовать коллекцию java. лучший подход для этого является списком массива

статических INT isLeft (ArrayList слева, ArrayList права)

{ 
     int f = 0; 
     for (int i = 0; i < left.size(); i++) { 
      for (int j = 0; j < right.size(); j++) 

      { 
       if (left.get(i).charAt(0) == right.get(j).charAt(0)) { 
        System.out.println("Grammar is left recursive"); 
        f = 1; 
       } 

      } 
     } 
     return f; 

    } 

    public static void main(String[] args) { 
     // TODO code application logic here 
     ArrayList<String> left = new ArrayList<String>(); 
     ArrayList<String> right = new ArrayList<String>(); 


     Scanner sc = new Scanner(System.in); 
     System.out.println("enter no of prod"); 
     int n = sc.nextInt(); 
     for (int i = 0; i < n; i++) { 
      System.out.println("enter left prod"); 
      String leftText = sc.next(); 
      left.add(leftText); 
      System.out.println("enter right prod"); 
      String rightText = sc.next(); 
      right.add(rightText); 
     } 

     System.out.println("the productions are"); 
     for (int i = 0; i < n; i++) { 
      System.out.println(left.get(i) + "->" + right.get(i)); 
     } 
     int flag; 
     flag = isLeft(left, right); 
     if (flag == 1) { 
      System.out.println("Removing left recursion"); 
     } else { 
      System.out.println("No left recursion"); 
     } 

    } 
Смежные вопросы