将文件数据传递给函数

Passing the file data into function

您好,我一直在尝试将文件中的 ipAdresses 传递给将执行 GET 操作的 SNMP 函数。我正在逐行读取文件并传递数据。但是我在 setAddress 处收到一个错误,如果我不从文件中传递,程序可以正常工作。看到代码第一行注释了ipAddress;

代码:

package com.snmp.discovery;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream.GetField;

import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Integer32;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;

public class Discover1 {

    private static String  port    = "8001";

    // OID of MIB CISCO-MGMT-MDM; Scalar Object = .iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0
    private static String  oidValue  = ".1.3.6.1.2.1.1.5.0";  // ends with 0 for scalar object

    private static int    snmpVersion  = SnmpConstants.version1;

    private static String  community  = "public";
    public static void main(String[] args) {
         try {
            // Open the file that is the first 
            // command line parameter
            FileInputStream fstream = new FileInputStream("textfile.txt");
            // Get the object of DataInputStream
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String strLine;
            //Read File Line By Line
            while ((strLine = br.readLine()) != null)   {
              // Print the content on the console
                Discover1.getDevice(strLine);
            }
            //Close the input stream
            in.close();
        }catch (Exception e){//Catch exception if any
            System.err.println("Error: " + e.getMessage());
        }
    }
    public static void getDevice(String a) throws Exception {
        System.out.println("SNMP GET Demo");
        System.out.println(a);
        // Create TransportMapping and Listen
        TransportMapping transport = new DefaultUdpTransportMapping();
        transport.listen();

        // Create Target Address object
        CommunityTarget comtarget = new CommunityTarget();
        comtarget.setCommunity(new OctetString(community));
        comtarget.setVersion(snmpVersion);

        comtarget.setAddress(new UdpAddress(a+"/"+port));
        System.out.println("------------");
        comtarget.setRetries(2);
        comtarget.setTimeout(1000);

        // Create the PDU object
        PDU pdu = new PDU();
        pdu.add(new VariableBinding(new OID(oidValue)));
        pdu.setType(PDU.GET);
        pdu.setRequestID(new Integer32(1));

        // Create Snmp object for sending data to Agent
        Snmp snmp = new Snmp(transport);

        System.out.println("Sending Request to Agent...");
        ResponseEvent response = snmp.get(pdu, comtarget);

        if (response != null){
            System.out.println("Got Response from Agent");
            PDU responsePDU = response.getResponse();

            if (responsePDU != null){
                int errorStatus = responsePDU.getErrorStatus();
                int errorIndex = responsePDU.getErrorIndex();
                String errorStatusText = responsePDU.getErrorStatusText();

                if (errorStatus == PDU.noError){
                    System.out.println("Snmp Get Response = " + responsePDU.getVariableBindings());
                } else {
                    System.out.println("Error: Request Failed");
                    System.out.println("Error Status = " + errorStatus);
                    System.out.println("Error Index = " + errorIndex);
                    System.out.println("Error Status Text = " + errorStatusText);
                }
            } else {
                System.out.println("Error: Response PDU is null");
            }
        } else {
            System.out.println("Error: Agent Timeout... ");
        }
        snmp.close();
    }
}

从错误消息来看,您的文件中似乎有空格。当您直接传递 IP 地址时,没有空格,因此可以正常工作。使用前需要去掉空格。

更改下一行

Discover1.getDevice(strLine);

删除前导和尾随空格。喜欢:

选项 1:

Discover1.getDevice(strLine.trim());

选项 2:

Discover1.getDevice(StringUtils.trim(strLine));

参考:StringUtils

所以这可能不是一个确切的答案,但它不适合放在评论中。

这很糟糕:

catch(Exception e) { .... }

仅当其他人的方法throws Exception 时才这样做。另外,如果可以的话,打那个人。

你自己的方法不应该methodName() throws Exception。它应该具体 methodName () throws IOException

你应该做 catch(IOException e) { ... } catch(IllegalArgumentException e) {...} 等等

如您所见,如果您不知道抛出的异常类型,则很难进行故障排除。

最后,在请求有关异常的帮助时,通常应该包括堆栈跟踪。例如:

Exception in thread "main" java.lang.NullPointerException at com.example.myproject.Book.getTitle(Book.java:16) at com.example.myproject.Author.getBookTitles(Author.java:25) at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

此信息有助于调试。