不能再用Public Static这样的方法了。

本文分析了一个涉及公共静态方法在高并发环境下出现的问题——“未将对象引用设置到对象的实例”。探讨了问题产生的原因,并尝试通过去除static关键字及采用实例化方法减少错误发生频率。

定义了Public Static之类的方法。当访问量大的时候。就会出现严重的错误,而且很难发现。

public void InsertVisitStatBrowse(string sessionID, int companyID, string viewURL,string fromURL,string fromEngine,string theYear, string theMonth, string theDay, string theHour)
  {
   //
   try
   {
    DataSet myDS=((DataSet)HttpContext.Current.Application["DaoGouDataSet"]);
    SqlDataAdapter myDA= (SqlDataAdapter)HttpContext.Current.Application["DaoGouDA"];
    DataTable myTable=myDS.Tables["VisitStatBrowse"];

    DataRow myRow=myTable.NewRow();
    myRow["sessionID"]=sessionID;
    myRow["companyID"]=companyID;
    myRow["viewURL"]=viewURL;
    myRow["fromURL"]=fromURL;
    myRow["fromEngine"]=fromEngine;
    myRow["theYear"]=theYear;
    myRow["theMonth"]=theMonth;
    myRow["theDay"]=theDay;
    myRow["theHour"]=theHour;
    myRow["ViewNumber"]=1;
    myTable.Rows.Add(myRow);
   }
   catch(Exception ex)
   {
    WebLog.WriteLog("插入数据到浏览统计出现了错误:" + ex.Message);  
   }
  }

如上面的方法。当给myRow赋值后,执行Rows.Add的时候,这时可能别的调用刚执行完 DataRow myRow=myTable.NewRow();,所以程序就会提示“未将对像引用设置到对像的实例”。

*****************************

以上的程序代码在访问量小的时候没有多大问题,但当访问量大的时候,就会经常出现“未将对像引用设置到对像的实例”。,所以我得到了上面的分析结果,不知道是否正确。我把static去掉,改成了实例引用的方法后。偶而也会出现那样的错误,但很多了。我想可能也是并发的原因。也可能是因为操作对像放在Application里的原因。

 

可以,但有前提条件。 ### 能否不用 `public static` 完成该程序? ✅ **逻辑上可以**:日期计算的核心功能(如判断闰年、获取每月天数、推算第二天)不需要 `public static` 也能实现。 ❌ **作为独立运行的 Java 程序则不行**:因为 Java 要求程序入口必须是 `public static void main(String[] args)` 方法。 --- ### 详细解释: Java 规定: > 每个可执行程序必须有一个 **`public static void main(String[] args)`** 方法作为入口点。 JVM 在启动时会查找这个特定签名的方法,并且它必须是: - `public`:保证 JVM 可以访问; - `static`:使得无需创建对象即可调用; - 名为 `main`,参数为 `String[] args`。 如果省略 `public` 或 `static`,JVM 将无法找到入口,程序**不能运行**。 --- ### ❌ 错误示例(无法运行) ```java class NextDate { void main(String[] args) { // 缺少 publicstatic System.out.println("不会被执行!"); } } ``` 结果:编译可能通过,但运行时报错 —— 找不到 `main` 方法。 --- ### ✅ 正确替代写法(仍需保留 public static) 你可以将核心逻辑封装在非静态方法中,然后在 `main` 中创建对象调用: ```java import java.util.Scanner; public class NextDate { // 非静态方法(实例方法) boolean isLeapYear(int year) { return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0); } int getMaxDay(int year, int month) { switch (month) { case 2: return isLeapYear(year) ? 29 : 28; case 4: case 6: case 9: case 11: return 30; default: return 31; } } public static void main(String[] args) { NextDate nd = new NextDate(); // 创建对象才能调用非静态方法 Scanner sc = new Scanner(System.in); while (sc.hasNext()) { String[] parts = sc.nextLine().split("/"); int year = Integer.parseInt(parts[0]); int month = Integer.parseInt(parts[1]); int day = Integer.parseInt(parts[2]); day++; if (day > nd.getMaxDay(year, month)) { day = 1; month++; if (month > 12) { month = 1; year++; } } System.out.println(year + "/" + month + "/" + day); } sc.close(); } } ``` > ✅ 这样做到了:核心逻辑不用 `static`,但 `main` 依然是 `public static`。 --- ### 结论 | 问题 | 回答 | |------|------| | 能不能完全去掉 `public static`? | ❌ 不行,`main` 方法必须是 `public static` | | 能不能让其他方法不是 `static`? | ✅ 可以,只要在 `main` 中通过对象调用即可 | 因此:**程序的部分代码可以不用 `static`,但 `public static void main` 是强制要求,不可省略。**
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值